home *** CD-ROM | disk | FTP | other *** search
- /*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1998
- Copyright (C) Luke Kenneth Casson Leighton 1994-1998
- Copyright (C) Jeremy Allison 1994-1998
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- */
-
- #include "includes.h"
- #include "smb.h"
-
- extern int DEBUGLEVEL;
-
- /* This is our local master browser list database. */
- struct browse_cache_record *lmb_browserlist = NULL;
-
- /***************************************************************************
- Add a browser into the lmb list.
- **************************************************************************/
-
- static void add_to_lmb_browse_cache(struct browse_cache_record *browc)
- {
- struct browse_cache_record *browc2;
-
- if (lmb_browserlist == NULL)
- {
- lmb_browserlist = browc;
- browc->prev = NULL;
- browc->next = NULL;
- return;
- }
-
- for (browc2 = lmb_browserlist; browc2->next; browc2 = browc2->next)
- ;
-
- browc2->next = browc;
- browc->next = NULL;
- browc->prev = browc2;
- }
-
- /*******************************************************************
- Remove a lmb browser entry.
- ******************************************************************/
-
- void remove_lmb_browser_entry(struct browse_cache_record *browc)
- {
- if (browc->prev)
- browc->prev->next = browc->next;
- if (browc->next)
- browc->next->prev = browc->prev;
-
- if (lmb_browserlist == browc)
- lmb_browserlist = browc->next;
-
- free((char *)browc);
- }
-
- /****************************************************************************
- Update a browser death time.
- ****************************************************************************/
-
- void update_browser_death_time(struct browse_cache_record *browc)
- {
- /* Allow the new lmb to miss an announce period before we remove it. */
- browc->death_time = time(NULL) + (CHECK_TIME_MST_ANNOUNCE + 2)*60;
- }
-
- /****************************************************************************
- Create a browser entry.
- ****************************************************************************/
-
- struct browse_cache_record *create_browser_in_lmb_cache(char *work_name, char *browser_name,
- struct in_addr ip)
- {
- struct browse_cache_record *browc;
- time_t now = time(NULL);
-
- browc = (struct browse_cache_record *)malloc(sizeof(*browc));
-
- if (browc == NULL)
- {
- DEBUG(0,("create_browser_in_lmb_cache: malloc fail !\n"));
- return(NULL);
- }
-
- bzero((char *)browc,sizeof(*browc));
-
- /* For a new lmb entry we want to sync with it after one minute. This
- will allow it time to send out a local announce and build its
- browse list. */
-
- browc->sync_time = now + 60;
-
- /* Allow the new lmb to miss an announce period before we remove it. */
- browc->death_time = now + (CHECK_TIME_MST_ANNOUNCE + 2)*60;
-
- StrnCpy(browc->lmb_name, browser_name,sizeof(browc->lmb_name)-1);
- StrnCpy(browc->work_group,work_name,sizeof(browc->work_group)-1);
- strupper(browc->lmb_name);
- strupper(browc->work_group);
-
- browc->ip = ip;
-
- add_to_lmb_browse_cache(browc);
-
- DEBUG(3,("create_browser_in_lmb_cache: Added lmb cache entry for workgroup %s name %s IP %s ttl %d\n",
- browc->work_group, browc->lmb_name, inet_ntoa(ip), browc->death_time));
-
- return(browc);
- }
-
- /****************************************************************************
- Find a browser entry.
- ****************************************************************************/
-
- struct browse_cache_record *find_browser_in_lmb_cache( char *browser_name )
- {
- struct browse_cache_record *browc = NULL;
-
- for( browc = lmb_browserlist; browc; browc = browc->next)
- if(strequal( browser_name, browc->lmb_name))
- break;
-
- return browc;
- }
-
- /*******************************************************************
- Expire timed out browsers in the browserlist.
- ******************************************************************/
-
- void expire_lmb_browsers(time_t t)
- {
- struct browse_cache_record *browc;
- struct browse_cache_record *nextbrowc;
-
- for (browc = lmb_browserlist; browc; browc = nextbrowc)
- {
- nextbrowc = browc->next;
-
- if (browc->death_time < t)
- {
- DEBUG(3,("expire_lmb_browsers: Removing timed out lmb entry %s\n",browc->lmb_name));
- remove_lmb_browser_entry(browc);
- }
- }
- }
-
- /*******************************************************************
- Remove browsers from a named workgroup in the browserlist.
- ******************************************************************/
-
- void remove_workgroup_lmb_browsers(char *work_group)
- {
- struct browse_cache_record *browc;
- struct browse_cache_record *nextbrowc;
-
- for (browc = lmb_browserlist; browc; browc = nextbrowc)
- {
- nextbrowc = browc->next;
-
- if (strequal(work_group, browc->work_group))
- {
- DEBUG(3,("remove_workgroup_browsers: Removing lmb entry %s\n",browc->lmb_name));
- remove_lmb_browser_entry(browc);
- }
- }
- }
-
-